/*
* 存储时间函数
* 解决跨页面修改变量造成页面间高耦合度问题 (wx.)
* 建立全局变量，用于存储变动所需要改变页面参数内容的函数
* 摘自wxNotificationCenter
* */

/*
*存储函数 以及页面数据
* */
let NOTICES = [];
/*
* 添加通知事件
* 传递三个参数
* name 用于匹配的函数注册名
* callback 所有保存的函数内容
* observer 当前页面Page对象
*
* 使用场景
* 上一个页面在改动某个参数后 需要更新多个相关的内容调用多个函数！
* 通过循环去执行name等于某个值得所有存储函数
* */
function add(params) {
    if (params.callback) {
        !params.observer ? console.error("addNotification Warning: no observer will can't remove notice") : "";
        NOTICES.push({name: params.name, callback: params.callback, observer: params.observer});
    } else {
        console.error("addNotification error: no callback or name");
    }
}
/*
* 仅添加一次监听
* 同一注册名只对应一个对象
* 只对应一个函数
*
* 使用场景
* 改变页面参数 需要更新内容所调用的函数只有一个
* */
function addOnce(params) {
    if (NOTICES.length > 0) {
        for (let i = 0; i < NOTICES.length; i++) {
            if (NOTICES[i].name === params.name && (NOTICES[i].observer === params.observer || (params.observer ? (NOTICES[i].observer.route === params.observer.route) : false))) return;
        }
    }
    add(params)
}
/*
* 发送通知
* 循环匹配获取注册名相同的函数 并 将需要传递的变量带入函数执行
*
* 使用场景
* 发送通知就是去全局变量数组中寻找已经存在的 函数（在observer page对象的环境中）并执行发送传递过来的参数值
* 从而改变匹配的page对象数据内容
* */
function post(params) {
    if(NOTICES.length === 0){
        console.error("postNotificationName error: u hadn't add any notice.");
        return;
    }
    for (let i = 0; i < NOTICES.length; i ++){
        if(NOTICES[i].name === params.name){
            NOTICES[i].callback(params.info);
        }
    }
}
/*
* 从全局变量中移除函数
* 根据注册名 和 page对象来判断所需从全局变量中删除的对象
* */
function remove(params) {
    for (let i = 0; i < NOTICES.length; i++) {
        if (NOTICES[i].name === params.name && (NOTICES[i].observer === params.observer || (params.observer ? (NOTICES[i].observer.route === params.observer.route) : false))) {
            NOTICES.splice(i, 1);
        };
    }
}

//配置验证
function _checked(params, noticeName) {
    if (!params.name || !params.name) {
        console.error(noticeName + "error");
        return false
    }
    return true
}

module.exports = {
    add,
    addOnce,
    remove,
    post
}